//package com.plian.system.service.om.module.impl;
//
//
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.google.common.collect.Lists;
//import com.plian.Tools.CollectionUtil;
//import com.plian.Tools.DateUtil;
//import com.plian.Tools.TokenUtil;
//import com.plian.Tools.pagedata.PageData;
//import com.plian.system.constant.sys.FormStatusConstant;
//import com.plian.system.dao.sys.fun.FunDao;
//import com.plian.system.dto.om.module.ModelByTime;
//import com.plian.system.dto.om.module.ModelTimeCountry;
//import com.plian.system.dto.om.module.ModuleConfigDTO;
//import com.plian.system.entity.om.module.ModuleChild;
//import com.plian.system.entity.om.module.ModuleConfig;
//import com.plian.system.entity.om.monitor.MonitorResult;
//import com.plian.system.mapper.om.ModuleConfigMapper;
//import com.plian.system.model.ObjResult;
//import com.plian.system.model.R;
//import com.plian.system.mybatis.base.BaseServiceImpl;
//import com.plian.system.service.om.module.IModuleChildService;
//import com.plian.system.service.om.module.IModuleConfigService;
//import com.plian.system.service.sys.orgzation.OrgzationService;
//import com.plian.system.vo.om.module.ModelByTimeVO;
//import com.plian.system.vo.om.module.ModuleConfigVO;
//import com.plian.system.wrapper.om.ModuleConfigWrapper;
//import lombok.AllArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.BeanUtils;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * 模块配置信息 服务实现类
// *
// * @author xiaohu
// */
//@Slf4j
//@Service
//@AllArgsConstructor
//public class ModuleConfigServiceImpl extends BaseServiceImpl<ModuleConfigMapper, ModuleConfig> implements IModuleConfigService {
//
//	private final ModuleConfigWrapper moduleConfigWrapper;
//
//	private final ModuleConfigMapper configMapper;
//
//	private final IModuleChildService moduleChildService;
//
//	private final FunDao funDao;
//
//	private final OrgzationService orgzationService;
//
//	/**
//	 * 批量保存模块配置信息
//	 * @param modelTimeCountry
//	 */
//	@Override
//	@Transactional(rollbackFor=Exception.class)
//	public R saveByTime(ModelTimeCountry modelTimeCountry){
//		List<ModelByTime> modelByTimes = modelTimeCountry.getModelByTimes();
//		List<String> orgIds = modelTimeCountry.getOrgIds();
//		//删除之前的
//		configMapper.delete(new LambdaQueryWrapper<ModuleConfig>().eq(ModuleConfig::getIsDeleted,0).in(ModuleConfig::getOrgId,orgIds));
//		List<ModuleConfig> saveConfigs = new ArrayList<>();
//		for (String orgId:orgIds){
//			if (CollectionUtil.isNotEmpty(modelByTimes)){
//				for (ModelByTime modelByTime:modelByTimes){
//					List<ModuleConfig> moduleConfigs = new ArrayList<>();
//					//删除子企业
//					moduleChildService.deleteAll(orgId,modelByTime.getStartTime(),modelByTime.getEndTime());
//					 moduleConfigs = modelByTime.getModuleConfigs();
//					//插入生效的起止时间
//					for (ModuleConfig moduleConfig:moduleConfigs){
//						//去除主键
//						moduleConfig.setId(null);
//						//合理性校验
//						if (Optional.ofNullable(moduleConfig.getIsAssessment()).isPresent()){
//							if (!modelCheck(moduleConfig)){
//								return R.fail("数据校验没通过");
//							}
//						}
//						moduleConfig.setStartTime(modelByTime.getStartTime());
//						moduleConfig.setEndTime(modelByTime.getEndTime());
//						//插入组织
//						moduleConfig.setOrgId(orgId);
//						//判断是否有子企业
//						List<String> childOrgIds = moduleConfig.getChildOrgIds();
//						if (CollectionUtil.isNotEmpty(childOrgIds)){
//							//保存子企业
//							moduleChildService.saveChilds(moduleConfig);
//							moduleConfig.setIsHaveChild(1);
//						}else {
//							moduleConfig.setIsHaveChild(0);
//						}
//						ModuleConfig config = new ModuleConfig();
//						BeanUtils.copyProperties(moduleConfig,config);
//						config.setCreateUser(TokenUtil.getTokenUserId());
//						Date now = DateUtil.now();
//						config.setCreateTime(now);
//						config.setUpdateTime(now);
//						if (config.getStatus() == null) {
//							config.setStatus(FormStatusConstant.UNREVIEWED);
//						}
//						config.setIsDeleted(0);
//						config.setCreateCompanyId(TokenUtil.getTokenOrgId());
//						saveConfigs.add(config);
//					}
//				}
//			}
//		}
//		List<List<ModuleConfig>> partition = Lists.partition(saveConfigs, 1000);
//		for (List<ModuleConfig> list:partition){
//			configMapper.insertList(list);
//		}
//
//		return R.success();
//	}
//
//	private Boolean modelCheck(ModuleConfig moduleConfig){
//		boolean b = true;
//		if (moduleConfig.getIsAssessment() == 1){
//			Integer periodic = moduleConfig.getPeriodic();
//			if (Optional.ofNullable(periodic).isPresent()){
//				if (!Optional.ofNullable(moduleConfig.getCalculateTime()).isPresent() && periodic > 0){
//					b = false;
//				}
//			}else {
//				b = false;
//			}
//		}
//		return b;
//	}
//
//	/**
//	 * 批量输出模块配置
//	 * @return
//	 */
//	@Override
//	public List<ModelByTimeVO> getAllModel(ModuleConfigDTO dto){
//		List<ModelByTimeVO> modelByTimes = new ArrayList<>();
//
//		List<String> orgIds = dto.getOrgIds();
//		String orgId = "";
//		if (CollectionUtil.isNotEmpty(orgIds)){
//			 orgId = orgIds.get(0);
//		}else {
//			return modelByTimes;
//		}
//
//		//获取模块
//		List<ModuleConfig> allModule = configMapper.selectList(new QueryWrapper<ModuleConfig>().eq("is_deleted", 0).eq("org_id",orgId));
//
//		//获取配置模块
//		List<PageData> byFormType = funDao.getByFormType();
//		List<PageData> formList = new ArrayList<>();
//		try {
//			formList = funDao.list(null);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		//获取时间起止戳
//		Map<Date, List<ModuleConfig>> configByDate = allModule.stream().collect(Collectors.groupingBy(ModuleConfig::getStartTime));
//
//		//获取批量子配
//		List<ModuleChild> childByList = moduleChildService.getChildByList();
//
////		List<ModuleConfig> moduleConfigs = new ArrayList<>();
//		if (CollectionUtil.isNotEmpty(configByDate)){
//			List<Date> startDates = configByDate.keySet().stream().sorted().collect(Collectors.toList());
//			for (Date startTime:startDates){
//				List<ModuleConfig> moduleConfigs = new ArrayList<>();
//				//循环构建 模块配置
//				ModelByTimeVO modelByTimeVO = new ModelByTimeVO();
//				modelByTimeVO.setStartTime(startTime);
//				//结束时间
//				List<ModuleConfig> moduleConfigList = configByDate.get(startTime);
//				Date endTime = moduleConfigList.get(0).getEndTime();
//				//获取配置
//				for (PageData pd :byFormType){
//					//组织
//					String name = pd.getString("name");
//					Integer formType = pd.getInteger("formType");
//					String pName = pd.getString("pName");
//					if (formType > 134 && formType<139){
//						//特殊处理
//						List<PageData> collect = formList.stream().filter(m -> m.getString("id").equals(pd.getString("parentId"))).collect(Collectors.toList());
//						if (CollectionUtil.isNotEmpty(collect)){
//							String pname = collect.get(0).getString("name");
//							name = pname + "_" + name;
//						}
//					}
//					String trueName = name;
//					List<ModuleConfig> collect = moduleConfigList.stream().filter(m -> formType.equals(m.getFormType()) && trueName.contains(m.getModuleName())).collect(Collectors.toList());
//					if (CollectionUtil.isNotEmpty(collect)){
//						ModuleConfig moduleConfig = collect.get(0);
//						moduleConfig.setModuleName(name);
//						moduleConfig.setBusinessName(pName);
//						moduleConfigs.add(moduleConfig);
//					}else {
//						ModuleConfig moduleConfig = new ModuleConfig();
//						moduleConfig.setModuleName(name);
//						moduleConfig.setBusinessName(pName);
//						moduleConfig.setFormType(formType);
//						moduleConfigs.add(moduleConfig);
//					}
//				}
//
//				if (CollectionUtil.isNotEmpty(moduleConfigs)){
//					if (CollectionUtil.isNotEmpty(childByList)){
//						//塞入子配置项
//						moduleConfigs.forEach(moduleConfig ->{
//							List<String> chileOrg = new ArrayList<>();
//							childByList.forEach(childConfig ->{
//								if (moduleConfig.getFormType().equals(childConfig.getFormType()) && moduleConfig.getOrgId().equals(childConfig.getOrgId()) &&
//										(moduleConfig.getStartTime().equals(childConfig.getStartTime()))  &&
//										(moduleConfig.getEndTime().equals(childConfig.getEndTime())) ){
//									chileOrg.add(childConfig.getChildOrgId());
//								}
//							});
//							moduleConfig.setChildOrgIds(chileOrg);
//						});
//					}
//
//					List<ModuleConfigVO> moduleConfigVOS = moduleConfigWrapper.entityToVO(moduleConfigs);
//					moduleConfigVOS = moduleConfigVOS.stream().sorted(Comparator.comparing(ModuleConfig::getFormType)).collect(Collectors.toList());
//					modelByTimeVO.setModuleConfigVOList(moduleConfigVOS);
//					modelByTimeVO.setEndTime(endTime);
//				}
//				modelByTimes.add(modelByTimeVO);
//			}
//		}else {
//			List<ModuleConfig> moduleConfigs = new ArrayList<>();
//			ModelByTimeVO modelByTimeVO = new ModelByTimeVO();
//			modelByTimeVO.setStartTime(new Date());
//
//			for (PageData pd:byFormType){
//				//组织
//				String name = pd.getString("name");
//				Integer formType = pd.getInteger("formType");
//				String pName = pd.getString("pName");
//				if (formType > 134 && formType<139){
//					//特殊处理
//					List<PageData> collect = formList.stream().filter(m -> m.getString("id").equals(pd.getString("parentId"))).collect(Collectors.toList());
//					if (CollectionUtil.isNotEmpty(collect)){
//						String pname = collect.get(0).getString("name");
//						name = pname + "_" + name;
//					}
//				}
//
//				ModuleConfig moduleConfig = new ModuleConfig();
//				moduleConfig.setModuleName(name);
//				moduleConfig.setBusinessName(pName);
//				moduleConfig.setFormType(formType);
//				moduleConfigs.add(moduleConfig);
//
//			}
//			List<ModuleConfigVO> moduleConfigVOS = moduleConfigWrapper.entityToVO(moduleConfigs);
//			moduleConfigVOS = moduleConfigVOS.stream().sorted(Comparator.comparing(ModuleConfigVO::getFormType)).collect(Collectors.toList());
//			modelByTimeVO.setModuleConfigVOList(moduleConfigVOS);
//			modelByTimeVO.setEndTime(new Date());
//			modelByTimes.add(modelByTimeVO);
//		}
//
//		return modelByTimes;
//	}
//
//	/**
//	 * 根据月份获取模块配置
//	 * @param month 月份
//	 * @param end
//	 * @param orgIds
//	 * @return
//	 */
//	@Override
//	public List<ModuleConfigVO> getModelByMonth(Date month,Date end,List<String> orgIds){
//		List<ModuleConfigVO> moduleConfigVOS = new ArrayList<>();
//		String start = DateUtil.format(month, DateUtil.PATTERN_DATE);
//		String endTime = DateUtil.format(end, DateUtil.PATTERN_DATE);
//		List<ModuleConfig> moduleConfigs = configMapper.selectList(new LambdaQueryWrapper<ModuleConfig>().le(ModuleConfig::getStartTime, start)
//				.ge(ModuleConfig::getEndTime, endTime).eq(ModuleConfig::getIsDeleted,0).in(ModuleConfig::getOrgId,orgIds));
//		if (CollectionUtil.isNotEmpty(moduleConfigs)){
//			List<PageData> orgList = (List<PageData>) orgzationService.listAll().getPageData().get("list");
//			for (ModuleConfig moduleConfig:moduleConfigs){
//				ModuleConfigVO moduleConfigVO = new ModuleConfigVO();
//				BeanUtils.copyProperties(moduleConfig,moduleConfigVO);
//				String orgName = orgList.stream().filter(m -> m.getString("orgId").equals(moduleConfig.getOrgId())).collect(Collectors.toList()).get(0).getString("name");
//				moduleConfigVO.setOrgName(orgName);
//				moduleConfigVOS.add(moduleConfigVO);
//			}
//		}
//		return moduleConfigVOS;
//	}
//
//	/**
//	 * 返回配置模块的子企业
//	 * @param start
//	 * @param end
//	 * @param orgId
//	 * @return
//	 */
//	@Override
//	public List<String> getModelByPid(Date start,Date end,String orgId){
//		List<String> ids = new ArrayList<>();
//		try {
//			List<PageData> chlidList = orgzationService.getChlidList(orgId);
//
//			List<String> orgIds = chlidList.stream().map(m -> m.getString("id")).collect(Collectors.toList());
//
//			List<ModuleConfigVO> modelByMonth = getModelByMonth(start, end, orgIds);
//			ids = modelByMonth.stream().map(ModuleConfigVO::getOrgId).collect(Collectors.toList());
//
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return ids;
//	}
//
//	/**
//	 * 单个模块修改更改该时间段配置
//	 * @param result
//	 */
//	@Override
//	public void editModelByResult(MonitorResult result){
//		ModuleConfig moduleConfig = configMapper.selectOne(new LambdaQueryWrapper<ModuleConfig>().eq(ModuleConfig::getOrgId, result.getOrgId())
//				.eq(ModuleConfig::getFormType, result.getFormType()).eq(ModuleConfig::getStartTime, result.getStartTime()));
//		if (Optional.ofNullable(moduleConfig).isPresent()){
//			if (result.getUsageNum() == 6){
//				moduleConfig.setIsEditLog(1);
//			}else {
//				moduleConfig.setIsEditLog(0);
//			}
//			configMapper.updateById(moduleConfig);
//		}
//	}
//
//
//}
